package com.atguigu;

import com.atguigu.dao.BookDao;
import com.atguigu.service.BookService;
import com.atguigu.servlet.BookServlet;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 伟哥
 * @date 2021-04-30 15:49
 *
 * Spring整合Junit4单元测试：【相当于把test类，加入Spring的ioc容器】
 *
 *      1、导包：Spring-text-版本-RELEASE.jar
 *      2、使用@ContextConfiguration(location="classpath:Spring配置文件的路径")，来指定Spring的配置文件
 *              【此注解依赖Spring-text-版本-RELEASE.jar这个包】
 *      3、使用@RunWith(SpringJUnit4ClassRunner.class)，指定junit使用哪种驱动单元进行测试，默认是junit
 *              【此注解依赖junit包】
 *              使用Spring的单元测试模块来执行，标了@Test注解的方法
 *              以前@Test注解只是由junit执行
 *
 *
 * 好处：我们不用
 *      private Application ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
 *      直接Autowire组件，Spring为我们自动装配
 */
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class test {
    //Spring整合test之后，自动注入ioc容器
    @Autowired
    private ApplicationContext ioc;


    /**
     * 实验1：
     *
     * 使用注解加入到ioc容器中的组件，和使用配置加入到容器中的组件，行为默认是一样的
     *      1、组件的id。默认是组件的类名首字母小写
     *          【修改名字】：@Repository("bookDao01")  在组件注解@Repository("填入新名字")
     *                       public class BookDao {
     *
     *      2、组件的作用域，默认是【单例模式】
     *          【多例模式】：@Scope(value = "prototype")
     *                      public class BookDao {
     */
    @Test
    public void test01(){
        BookDao bookDao01 = ioc.getBean("bookDao01", BookDao.class);
        BookDao bookDao02 = ioc.getBean("bookDao01", BookDao.class);
        // 测试单例、多例
        System.out.println(bookDao02 == bookDao01);
    }

    /**
     * 实验2：使用context:exclude-filter 扫描时，排除指定的类（黑名单）
     */
    @Test
    public void test02(){
        BookService bookService = ioc.getBean("bookService", BookService.class);

    }

    /**
     * 实验3：使用context:include-filter 扫描时，只需要指定的类（白名单）
     */
    @Test
    public void test03(){
        BookService bookService = ioc.getBean("bookService", BookService.class);

    }

    /**
     * 实验4：使用@Autowired，自动给
     *      com.atguigu.dao.BookDao
     *      com.atguigu.dao.BookService
     *      com.atguigu.dao.BookSServlet
     *      自动装配
     */
    @Test
    public void test04(){
        BookServlet bookServlet = ioc.getBean("bookServlet", BookServlet.class);
        bookServlet.doGet();
    }

     /**
     * 实验5：给方法上使用@Autowired注解
     *      1）、这个方法会在bean创建的时候【自动运行】
     *      2）、这个方法的【每一个参数都会自动注入值】
     */
    @Test
    public void test05(){

    }

}
